Tugas Analisis Multimedia: Audio, Gambar, Video¶
Mata Kuliah: Sistem & Teknologi Multimedia
Nama: Reynaldi Cristian Simamora
NIM: 122140116
Deskripsi Tugas¶
Tugas ini bertujuan untuk memahami representasi dasar data multimedia (audio, gambar, dan video) melalui praktik langsung memuat data, visualisasi, dan ekstraksi informasi fundamental. Anda akan bekerja dengan tiga jenis media berbeda untuk menganalisis karakteristik temporal (audio), spasial (gambar), dan spatio-temporal (video).
Fokus tugas adalah pada pemahaman konsep dasar representasi multimedia dan kemampuan interpretasi hasil visualisasi, bukan pada manipulasi atau transformasi lanjutan data multimedia.
⚠️ CATATAN PENTING: PRESENTASI ACAK & KEJUJURAN AKADEMIK¶
Sebagian mahasiswa akan dipilih secara ACAK untuk presentasi singkat (5-10 menit) menjelaskan kode dan interpretasi hasil mereka. Jika Anda:
- Tidak mampu menjelaskan kode yang Anda kumpulkan
- Hanya menyalin-tempel tanpa pemahaman
- Bergantung sepenuhnya pada AI tanpa memahami konsep
Maka nilai tugas Anda akan diberikan 0 (nol).
Gunakan referensi dan AI sebagai alat bantu pembelajaran, tetapi pastikan Anda memahami setiap baris kode dan dapat menjelaskan logika di baliknya.
# Import Library (Satu-satunya sel kode dalam template ini)
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import librosa
import soundfile as sf
from PIL import Image
import cv2
from IPython.display import Audio, HTML, display
import os
# Set matplotlib untuk menampilkan plot inline
%matplotlib inline
# Tampilkan versi library untuk dokumentasi
print("Library versions:")
print(f"NumPy: {np.__version__}")
print(f"Matplotlib: {matplotlib.__version__}")
print(f"Librosa: {librosa.__version__}")
print(f"OpenCV: {cv2.__version__}")
# Tambahkan import lain jika diperlukan saat mengerjakan tugas
Library versions: NumPy: 2.2.6 Matplotlib: 3.10.6 Librosa: 0.11.0 OpenCV: 4.12.0
Petunjuk Umum Pengerjaan¶
📋 Cara Menggunakan Template¶
- Gunakan notebook ini sebagai kerangka kerja utama
- Tulis penjelasan (markdown) SEBELUM menaruh kode agar maksud dan tujuan jelas
- Tambahkan sel kode di tempat yang sudah disediakan (tandai dengan TODO)
- Semua plot/gambar harus diberi judul, label sumbu, dan keterangan singkat
📊 Standar Visualisasi¶
- Setiap plot harus memiliki judul yang deskriptif
- Label sumbu X dan Y harus jelas
- Gunakan colorbar untuk plot yang memerlukan skala warna
- Berikan interpretasi singkat setelah setiap visualisasi
📂 Struktur Data yang Direkomendasikan¶
- Buat folder
data/di direktori yang sama dengan notebook - Gunakan nama file yang deskriptif (contoh:
audio_musik_piano.wav,gambar_pemandangan_gunung.jpg) - Dokumentasikan sumber data jika menggunakan dataset publik
⚠️ Larangan¶
- Jangan menaruh seluruh pekerjaan dalam satu sel kode yang sangat panjang
- Jangan menempel hasil output tanpa interpretasi atau analisis
- Jangan bergantung sepenuhnya pada AI - pahami dan kuasai kode Anda
🎯 Persiapan Presentasi Acak¶
- Pastikan Anda memahami setiap baris kode yang ditulis
- Latih menjelaskan logika dan alur pemikiran Anda
- Siapkan penjelasan untuk setiap visualisasi dan interpretasinya
## Checklist Kelengkapan (Centang ✅ saat selesai)
### 🎵 Bagian Audio
- [✅] Muat audio dan tampilkan metadata (durasi, sample rate, jumlah kanal)
- [✅] Tampilkan waveform dengan label sumbu yang jelas
- [✅] Tampilkan spectrogram dalam skala log-dB dengan colorbar
- [✅] Tampilkan MFCC (minimal 13 koefisien) sebagai heatmap
- [✅] Berikan interpretasi dan analisis untuk setiap visualisasi audio
### 🖼️ Bagian Gambar
- [✅] Tampilkan gambar dengan benar dalam format RGB
- [✅] Tampilkan informasi dasar (dimensi, jumlah kanal, dtype)
- [✅] Tampilkan histogram warna untuk channel R, G, B
- [✅] Berikan analisis hubungan histogram dengan kesan visual gambar
### 📹 Bagian Video
- [✅] Tampilkan metadata video (resolusi, fps, frame count, durasi)
- [✅] Tampilkan 3 frame representatif (awal, tengah, akhir)
- [✅] Konversi BGR ke RGB dengan benar untuk visualisasi
- [✅] Analisis kesesuaian parameter video dengan use case
### 📝 Analisis & Dokumentasi
- [✅] Setiap bagian memiliki interpretasi dan analisis ringkas
- [✅] Perbandingan representasi ketiga jenis media
- [✅] Kesimpulan pembelajaran dan refleksi
- [✅] Semua sumber data dan referensi dicantumkan
Pendahuluan¶
Apa itu Data Multimedia?¶
Data multimedia adalah informasi yang dikodekan dalam berbagai format untuk merepresentasikan dunia nyata:
Audio (1D): Sinyal satu dimensi yang berubah terhadap waktu
- Contoh: musik, suara, speech
- Representasi: amplitudo vs waktu
Gambar (2D): Matriks nilai intensitas dalam ruang dua dimensi
- Contoh: foto, ilustrasi, grafik
- Representasi: intensitas pixel pada koordinat (x,y)
Video (2D + Waktu): Rangkaian frame (gambar) yang ditampilkan berurutan
- Contoh: film, rekaman, animasi
- Representasi: frame berubah terhadap waktu dengan frame rate tertentu
Tujuan Tugas¶
Memahami representasi dasar dan teknik visualisasi fundamental untuk setiap jenis media multimedia, termasuk:
- Cara memuat dan membaca file multimedia
- Ekstraksi informasi metadata yang penting
- Visualisasi yang informatif dan mudah dipahami
- Interpretasi hasil analisis secara kontekstual
Cara Kerja¶
- Isi setiap bagian sesuai instruksi yang diberikan
- Tambahkan sel kode di tempat yang ditandai dengan "TODO"
- Berikan interpretasi dan analisis setelah setiap visualisasi
- Pastikan semua plot memiliki judul, label, dan keterangan yang jelas
Bagian A — Audio¶
A1. Deskripsi Data¶
TODO: Jelaskan audio yang akan Anda analisis:
- Jenis audio: Musik "Don't let me down" By The Beatles.
- Sumber: Youtube (https://youtu.be/NCtzkaL2t_Y?si=jNO76JsGKMXRTVe9).
- Format file: .wav
- Alasan pemilihan: Saya ingin melihat informasi data audio dari musik yang saya sukai.
Audio yang saya gunakan adalah audio musik berjudul Don't Let Me Down karya band The BEatles. Saya mengambil medianya dari kanal youtube resmi dari The Beatles. Format media audio-nya adalah wav karena sudah jadi standar format yang biasa digunakan dan lebih baik dibanding mp3. Mengapa memilih audio ini, saya ingin mendalami informasi lagu ini terutama beatnya.
Path file: data/audio.wav (isi nama file Anda nanti di kode)
A2. TODO: Muat & Metadata¶
Instruksi: Tulis kode untuk memuat file audio dan menampilkan metadata dasar:
- Sample rate (Hz)
- Durasi (detik)
- Jumlah kanal (mono/stereo)
- Jumlah total sampel
Catatan: Jika file MP3 bermasalah saat loading, gunakan format WAV sebagai alternatif.
Penjelasan Kode Di Bawah
Kode di bawah adalah kode untuk inisiasi awal media untuk dapat diolah. Untuk inisiasi awal dari path medianya, yaitu menngampil path lokal dari data/audio.wav. Kemudian akan dimuat audionya dengan 'try' jika bisa akan mengeluarkan keluaran berhasil dan jika tidak akan menampilkan tipe error yang muncul. Kemudian ada proses konversi stereo ke mono, untuk memudahkan proses analisa, dengan mencari rata-rata titik sample masing masing kanal.
# Memuat Audio dengan Sistem Fallback
PATH_AUDIO = os.path.join(os.getcwd(), 'data', 'audio.wav')
# Variabel untuk menyimpan hasil
y = None
sr = None
source_info = ""
# Opsi 1: Coba muat file lokal
try:
if os.path.exists(PATH_AUDIO):
y, sr = librosa.load(PATH_AUDIO, sr=None) # sr=None untuk mempertahankan sample rate asli
source_info = f"✅ Berhasil memuat: {PATH_AUDIO}"
else:
raise FileNotFoundError("File tidak ditemukan")
except:
print(f"⚠️ Tidak dapat memuat {PATH_AUDIO}")
# Opsi 2: Gunakan contoh bawaan librosa
try:
y, sr = librosa.load(librosa.ex('trumpet'), sr=None)
source_info = "✅ Menggunakan contoh audio bawaan librosa (trumpet)"
except:
print("⚠️ Contoh librosa tidak tersedia")
# Konversi ke mono jika stereo
if y.ndim > 1:
y = np.mean(y, axis=0) # Rata-rata semua kanal
source_info += " - Dikonversi ke mono"
# Pastikan tipe data float32 untuk efisiensi
y = y.astype(np.float32)
print(source_info)
print(f"📊 Shape data: {y.shape}")
print(f"🎵 Sample rate: {sr} Hz")
✅ Berhasil memuat: f:\mulmed\data\audio.wav 📊 Shape data: (10138576,) 🎵 Sample rate: 48000 Hz
Dari output yang diperlihatkan data berhasil dimuat, dan bentuk data atau jumlah titik samplenya adalah 10.138.576 titik sample, Dengan sample rate atau titik sample perdetik 48000. Yang artinya jumlah durasi dari audio ini adalah 211,22 detik.
Kode di bawah bertujuan untuk melakukan analisis metadata dan kualitas sinyal audio. Dimana pertama akan menampilkan informasi jumlah sample, sample rate, estimasi durasi, audio, jumlah kanal, dan tipe data yang digunakan. Kemudin ada analisis amplitudo, dan pengecekan audio yang mengalami clipping.
# Analisis Metadata Audio
print("📋 METADATA AUDIO")
print("=" * 40)
print(f"🔢 Jumlah sampel: {len(y):,}")
print(f"🎵 Sample rate: {sr:,} Hz")
print(f"⏱️ Durasi: {len(y)/sr:.2f} detik")
print(f"📻 Jumlah kanal: {'Mono (1 kanal)' if y.ndim == 1 else f'Multi-kanal ({y.ndim} kanal)'}")
print(f"📊 Tipe data: {y.dtype}")
print()
print("📈 STATISTIK AMPLITUDO")
print("=" * 40)
print(f"🔽 Nilai minimum: {np.min(y):.4f}")
print(f"🔼 Nilai maksimum: {np.max(y):.4f}")
print(f"📊 Nilai rata-rata: {np.mean(y):.4f}")
print(f"📏 Standar deviasi: {np.std(y):.4f}")
# Cek apakah audio terlalu keras (clipping)
if np.abs(y).max() >= 0.99:
print("⚠️ PERINGATAN: Audio mungkin mengalami clipping (terlalu keras)")
else:
print("✅ Audio dalam range amplitudo yang sehat")
📋 METADATA AUDIO ======================================== 🔢 Jumlah sampel: 10,138,576 🎵 Sample rate: 48,000 Hz ⏱️ Durasi: 211.22 detik 📻 Jumlah kanal: Mono (1 kanal) 📊 Tipe data: float32 📈 STATISTIK AMPLITUDO ======================================== 🔽 Nilai minimum: -1.0000 🔼 Nilai maksimum: 1.0000 📊 Nilai rata-rata: 0.0000 📏 Standar deviasi: 0.2324 ⚠️ PERINGATAN: Audio mungkin mengalami clipping (terlalu keras)
A3. TODO: Waveform¶
Instruksi: Plot waveform audio dengan:
- Sumbu X: 211 Detik
- Sumbu Y: amplitudo (-1 hingga 1)
- Waveform seluruh audio dan waveform bagian chorus dari 0 hingga 27 detik
Analisis yang diperlukan: Jelaskan apa yang Anda lihat dari waveform (pola amplitudo, bagian keras/pelan, dll.)
Penjelasan Kode Kode yang disajikan bertujuan untuk melakukan visualisasi bentuk gelombang (waveform) audio dalam dua tingkat detail. Pertama, dibuat vektor waktu yang disesuaikan dengan jumlah sampel audio sehingga sumbu horizontal pada grafik dapat merepresentasikan durasi dalam satuan detik. Visualisasi dilakukan dalam dua subplot.
Subplot pertama menampilkan waveform lengkap sepanjang durasi total audio (±211 detik) sehingga memberikan gambaran umum dinamika amplitudo sinyal. Pada bagian ini juga ditambahkan anotasi berupa informasi durasi total sebagai keterangan tambahan.
Subplot kedua menampilkan visualisasi detail pada sebagian kecil sinyal, yaitu pada rentang 0–27 detik. Tujuan dari zoom ini adalah untuk memperlihatkan pola osilasi sinyal audio pada level sampel sehingga struktur getaran dasar dapat diamati lebih jelas. Pada plot ini disertakan pula anotasi mengenai jumlah sampel yang divisualisasikan.
# Plot Waveform dengan Detail Zoom
# Buat vektor waktu
t = np.linspace(0, len(y)/sr, len(y))
# Setup plot dengan 2 subplot
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 8))
# Plot 1: Waveform lengkap
ax1.plot(t, y, color='blue', linewidth=0.5)
ax1.set_title('🎵 Waveform Audio Lengkap "Dont Let Me Down" - The Beatles', fontsize=14, fontweight='bold')
ax1.set_xlabel('Waktu (detik)')
ax1.set_ylabel('Amplitudo')
ax1.grid(True, alpha=0.3)
ax1.set_ylim([-1.1, 1.1])
# Tambahkan informasi durasi
duration_text = f'Durasi total: {len(y)/sr:.2f} detik'
ax1.text(0.02, 0.95, duration_text, transform=ax1.transAxes,
bbox=dict(boxstyle="round,pad=0.3", facecolor="lightblue", alpha=0.7))
# Plot 2: Zoom detail 0-27 detik
zoom_duration = min(27, (len(y)/sr))
zoom_samples = int(zoom_duration * sr)
t_zoom = t[:zoom_samples]
y_zoom = y[:zoom_samples]
ax2.plot(t_zoom, y_zoom, color='red', linewidth=1.5, marker='o', markersize=2)
ax2.set_title(f'🔍 Detail Waveform (0 - {zoom_duration:.3f} detik - Bagian Chorus Awal)', fontsize=14, fontweight='bold')
ax2.set_xlabel('Waktu (detik)')
ax2.set_ylabel('Amplitudo')
ax2.grid(True, alpha=0.3)
ax2.set_ylim([-1.1, 1.1])
# Tambahkan informasi zoom
zoom_text = f'Menampilkan {zoom_samples} sampel pertama'
ax2.text(0.02, 0.95, zoom_text, transform=ax2.transAxes,
bbox=dict(boxstyle="round,pad=0.3", facecolor="lightcoral", alpha=0.7))
plt.tight_layout()
plt.show()
print(f"✅ Waveform berhasil ditampilkan!")
print(f"📊 Total sampel yang diplot: {len(y):,}")
print(f"🔍 Sampel zoom detail: {zoom_samples}")
C:\Users\ANSEN\AppData\Local\Temp\ipykernel_3808\3130596663.py:39: UserWarning: Glyph 127925 (\N{MUSICAL NOTE}) missing from font(s) DejaVu Sans.
plt.tight_layout()
C:\Users\ANSEN\AppData\Local\Temp\ipykernel_3808\3130596663.py:39: UserWarning: Glyph 128269 (\N{LEFT-POINTING MAGNIFYING GLASS}) missing from font(s) DejaVu Sans.
plt.tight_layout()
c:\Users\ANSEN\.conda\envs\multimedia\Lib\site-packages\IPython\core\pylabtools.py:170: UserWarning: Glyph 127925 (\N{MUSICAL NOTE}) missing from font(s) DejaVu Sans.
fig.canvas.print_figure(bytes_io, **kw)
c:\Users\ANSEN\.conda\envs\multimedia\Lib\site-packages\IPython\core\pylabtools.py:170: UserWarning: Glyph 128269 (\N{LEFT-POINTING MAGNIFYING GLASS}) missing from font(s) DejaVu Sans.
fig.canvas.print_figure(bytes_io, **kw)
✅ Waveform berhasil ditampilkan! 📊 Total sampel yang diplot: 10,138,576 🔍 Sampel zoom detail: 1296000
# Memutar Audio di Notebook
print("🔊 Audio Player - Pastikan volume tidak terlalu keras!")
print(f"🎵 Durasi: {len(y)/sr:.2f} detik")
print(f"📻 Sample rate: {sr} Hz")
print("▶️ Klik tombol play di bawah untuk mendengar audio:")
# Tampilkan audio player
Audio(y, rate=sr)
🔊 Audio Player - Pastikan volume tidak terlalu keras! 🎵 Durasi: 211.22 detik 📻 Sample rate: 48000 Hz ▶️ Klik tombol play di bawah untuk mendengar audio: